#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *print_message_function(void *ptr);

main()
{
     pthread_t thread1, thread2, thread3;
     char *message1 = "Thread 1";
     char *message2 = "Thread 2";
     char *message3 = "Thread 3";
     int  iret1, iret2, iret3;

/* Criando threads independentes da qual executaram uma função */

     iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1);
     iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2);
     iret3 = pthread_create(&thread3, NULL, print_message_function, (void*) message3);

/* Espere até threads estiverem completas antes da função principal continuar. 
A menos que esperemos, corremos o risco de executar uma saída que terminará
o processo e todas threads antes das threads forem concluídas. */

     pthread_join(thread1, NULL);
     pthread_join(thread2, NULL);
     pthread_join(thread3, NULL);  

/*Um join é realizado quando se quer esperar pelo fim de uma thread. A chamada 
de rotina da thread de chamada pode lançar vários segmentos, em seguida, esperar 
por eles ao fim para obter os resultados. Se espera para a conclusão das threads 
com um join */


     printf("Thread 1 returns: %d\n",iret1);
     printf("Thread 2 returns: %d\n",iret2);
     printf("Thread 3 returns: %d\n",iret3);	
     exit(0);
}

/*Função executada pela Thread */
void *print_message_function(void *ptr)
{
     char *message;
     message = (char *) ptr;
     printf("%s \n", message);
}
